package com.ruoyi.team.service.impl;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.team.service.ICustomerTeamService;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.team.mapper.ContractMapper;
import com.ruoyi.team.domain.Contract;
import com.ruoyi.team.service.IContractService;

/**
 * 合同信息Service业务层处理
 *
 * @author shier
 * @date 2022-11-27
 */
@Service
public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> implements IContractService {

    @Autowired
    private ICustomerTeamService customerTeamService;
    @Autowired
    private ISysUserService      sysUserService;

    /**
     * 查询合同信息列表
     *
     * @param contract 合同信息
     * @return 合同信息
     */
    @Override
    public List<Contract> selectContractList(Contract contract) {
        List<Contract> contractList = getBaseMapper().selectContractList(contract);

        for (Contract currentContract : contractList) {
            // 设置录入人名字
            currentContract.setInputUserName(sysUserService.selectUserById(currentContract.getInputUser()).getNickName());
            // 设置客户名字
            currentContract.setCustomerName(customerTeamService.getById(currentContract.getCustomerId()).getCustomerName());
        }

        return contractList;
    }

    /**
     * 修改审核状态
     *
     * @param id          合同信息ID
     * @param auditResult 审核结果
     * @return            是否修改成功
     */
    @Override
    public boolean updateAuditStatusById(Long id, Boolean auditResult) {
        Contract contract = super.getById(id);

        if (contract.getNullifyState().equals(Contract.IS_NULLIFYSTATE_TRUE)) {
            throw new SecurityException("当前合同是被废止的, 不能进行任何操作");
        }

        if (!contract.getAuditState().equals(Contract.CONTRACT_AUDIT_STATUS_AWAIT)) {
            throw new SecurityException("当前审核状态不为待审核, 不能对审核状态进行修改");
        }

        // 判断是否 审核通过
        if (auditResult) {
            contract.setAuditState(Contract.CONTRACT_AUDIT_STATUS_SUCCESS);
        } else {
            contract.setAuditState(Contract.CONTRACT_AUDIT_STATUS_NO_PASSED);
        }

        return super.updateById(contract);
    }

    /**
     * 通过盖章
     *
     * @param id 合同信息ID
     * @return   是否通过
     */
    @Override
    public boolean updateAffixSealById(Long id) {
        Contract contract = super.getById(id);

        if (contract.getNullifyState().equals(Contract.IS_NULLIFYSTATE_TRUE)) {
            throw new SecurityException("当前合同是被废止的, 不能进行任何操作");
        }

        if (!contract.getAuditState().equals(Contract.CONTRACT_AUDIT_STATUS_SUCCESS)) {
            throw new SecurityException("当前审核状态没被通过, 不能进行盖章");
        }

        contract.setAffixSealState(Contract.IS_AFFIXSEALSTATE_TRUE);
        return super.updateById(contract);
    }

    /**
     * 文件下载
     *
     * @param id 合同信息ID
     */
    /*@Override
    public void downloadFile(Long id, HttpServletRequest request, HttpServletResponse response) {
        Contract contract = super.getById(id);

        String url = contract.getAppendix();

        if (url == null) {
            throw new SecurityException("当前合同暂无文件, 不能进行下载");
        }

        FileDownloadUtils.downloadFileURL(contract.getAppendix(), request, response);
    }
*/
    /**
     * 新增 合同管理
     *
     * @param entity 合同管理对象
     * @return       新增结果
     */
    @Override
    public boolean save(Contract entity) {
        // 录入人ID
        entity.setInputUser(SecurityUtils.getUserId());
        // 录入时间
        entity.setInputTime(new Date());

        // 状态: 待审核
        entity.setAuditState(Contract.CONTRACT_AUDIT_STATUS_AWAIT);
        // 盖章: 否
        entity.setAffixSealState(Contract.IS_AFFIXSEALSTATE_FALSE);
        // 作废: 否
        entity.setNullifyState(Contract.IS_NULLIFYSTATE_FALSE);

        return super.save(entity);
    }

    /**
     * 修改 合同管理
     *
     * @param entity 需要修改的合同管理对象
     * @return       是否修改成功
     */
    @Override
    public boolean updateById(Contract entity) {
        if (entity.getNullifyState().equals(Contract.IS_NULLIFYSTATE_TRUE)) {
            throw new SecurityException("当前合同是被废止的, 不能进行任何操作");
        }

        if (!entity.getAuditState().equals(Contract.CONTRACT_AUDIT_STATUS_NO_PASSED)) {
            throw new SecurityException("当前合同不是未通过, 不能被修改");
        }

        if (!entity.getInputUser().equals(SecurityUtils.getUserId())) {
            throw new SecurityException("当前登录用户非录入人,不能进行修改");
        }
        // 如果能修改, 把审核状态更改为待审核
        entity.setAuditState(Contract.CONTRACT_AUDIT_STATUS_AWAIT);

        return super.updateById(entity);
    }

    /**
     * 作废 合同管理
     *
     * @param id 合同管理ID
     * @return   作废结果
     */
    @Override
    public boolean removeById(Serializable id) {

        Contract contract = super.getById(id);

        // 通过 & 盖章 ==> 合同不能作废
        if (contract.getAuditState().equals(Contract.CONTRACT_AUDIT_STATUS_SUCCESS) &&
            contract.getAffixSealState().equals(Contract.IS_AFFIXSEALSTATE_TRUE)) {
            throw new SecurityException("当前合同不能作废!");
        }

        contract.setNullifyState(Contract.IS_NULLIFYSTATE_TRUE);

        return super.updateById(contract);
    }
}
